package org.infinispan.objectfilter.impl.syntax.parser;
import java.beans.IntrospectionException;
import java.util.Arrays;
import java.util.List;
import org.infinispan.objectfilter.impl.util.ReflectionHelper;
/**
* @author anistor@redhat.com
* @since 7.0
*/
public class ReflectionPropertyHelper extends ObjectPropertyHelper<Class<?>> {
private final EntityNameResolver entityNameResolver;
public ReflectionPropertyHelper(EntityNameResolver entityNameResolver) {
if (entityNameResolver == null) {
throw new IllegalArgumentException("The entityNameResolver argument cannot be null");
}
this.entityNameResolver = entityNameResolver;
}
@Override
public Class<?> getEntityMetadata(String typeName) {
return entityNameResolver.resolve(typeName);
}
@Override
public List<?> mapPropertyNamePathToFieldIdPath(Class<?> type, String[] propertyPath) {
return Arrays.asList(propertyPath);
}
@Override
public Class<?> getPrimitivePropertyType(Class<?> entityType, String[] propertyPath) {
try {
Class<?> propType = getPropertyAccessor(entityType, propertyPath).getPropertyType();
if (propType.isEnum()) {
return propType;
}
return primitives.get(propType);
} catch (IntrospectionException e) {
// ignored
}
return null;
}
@Override
public boolean hasEmbeddedProperty(Class<?> entityType, String[] propertyPath) {
try {
Class<?> propType = getPropertyAccessor(entityType, propertyPath).getPropertyType();
return propType != null && !propType.isEnum() && !primitives.containsKey(propType);
} catch (IntrospectionException e) {
return false;
}
}
@Override
public boolean isRepeatedProperty(Class<?> entityType, String[] propertyPath) {
try {
ReflectionHelper.PropertyAccessor a = ReflectionHelper.getAccessor(entityType, propertyPath[0]);
if (a.isMultiple()) {
return true;
}
for (int i = 1; i < propertyPath.length; i++) {
a = a.getAccessor(propertyPath[i]);
if (a.isMultiple()) {
return true;
}
}
} catch (IntrospectionException e) {
// ignored
}
return false;
}
@Override
public boolean hasProperty(Class<?> entityType, String[] propertyPath) {
try {
Class<?> propType = getPropertyAccessor(entityType, propertyPath).getPropertyType();
return propType != null;
} catch (IntrospectionException e) {
return false;
}
}
private ReflectionHelper.PropertyAccessor getPropertyAccessor(Class<?> entityClass, String[] propertyPath) throws IntrospectionException {
if (propertyPath == null || propertyPath.length == 0) {
throw new IllegalArgumentException("propertyPath name cannot be null or empty");
}
ReflectionHelper.PropertyAccessor accessor = ReflectionHelper.getAccessor(entityClass, propertyPath[0]);
for (int i = 1; i < propertyPath.length; i++) {
accessor = accessor.getAccessor(propertyPath[i]);
}
return accessor;
}
}